#ifndef __glsmapint_h__
#define __glsmapint_h__

/* Copyright (c) Mark J. Kilgard, 1998. */

/* This program is freely distributable without licensing fees 
   and is provided without guarantee or warrantee expressed or 
   implied. This program is -not- in the public domain. */

#include <GL/glsmap.h>

enum { X = 0, Y = 1, Z = 2 };

#define INITFACE(mesh) \
    int steps = mesh->steps; \
    int sqsteps = mesh->steps * mesh->steps

#define FACE(side,y,x) \
    mesh->face[(side)*sqsteps + (y)*steps + (x)]

#define FACExy(side,i,j) \
    (&FACE(side,i,j).x)

#define FACEst(side,i,j) \
    (&FACE(side,i,j).s)

#define INITBACK(mesh) \
    int allrings = mesh->rings + mesh->edgeExtend; \
    int ringedspokes = allrings * mesh->steps

#define BACK(edge,ring,spoke) \
    mesh->back[(edge)*ringedspokes + (ring)*mesh->steps + (spoke)]

#define BACKxy(edge,ring,spoke) \
    (&BACK(edge,ring,spoke).x)

#define BACKst(edge,ring,spoke) \
    (&BACK(edge,ring,spoke).s)

typedef struct _STXY {
    GLfloat s, t;
    GLfloat x, y;
} STXY;

typedef struct _SphereMapMesh {

    int refcnt;

    int steps;
    int rings;
    int edgeExtend;

    STXY *face;
    STXY *back;

} SphereMapMesh;

struct _SphereMap {

    /* Shared sphere map mesh vertex data. */
    SphereMapMesh *mesh;

    /* Texture object ids. */
    GLuint smapTexObj;
    GLuint viewTexObjs[6];
    GLuint viewTexObj;

    /* Flags */
    SphereMapFlags flags;

    /* Texture dimensions must be a power of two. */
    int viewTexDim;  /* view texture dimension */
    int smapTexDim;  /* sphere map texture dimension */

    /* Viewport origins for view and sphere map rendering. */
    int viewOrigin[2];
    int smapOrigin[2];

    /* Viewing vectors. */
    GLfloat eye[3];
    GLfloat up[3];
    GLfloat obj[3];

    /* Projection parameters. */
    GLfloat viewNear;
    GLfloat viewFar;

    /* Rendering callbacks. */
    void (*positionLights)(int view, void *context);
    void (*drawView)(int view, void *context);

    /* Application specified callback data. */
    void *context;

};

/* Library internal routines. */
extern void __smapDrawSphereMapMeshSide(SphereMapMesh *mesh, int side);
extern void __smapDrawSphereMapMeshBack(SphereMapMesh *mesh);
extern void __smapValidateSphereMapMesh(SphereMapMesh *mesh);

#endif /* __glsmapint_h__ */
